package gbase

// type OptionType string
type Option[T any] func(T)

// 带类型的option
type OptionType[T any] interface {
	Apply(T)
	Type() string
}

type optionFunc[T any] struct {
	fn  func(T)
	typ string
}

func (o optionFunc[T]) Apply(obj T) {
	o.fn(obj)
}
func (o optionFunc[T]) Type() string {
	return o.typ
}

// 工厂函数
func NewOptionType[T any](fn func(T), typ string) OptionType[T] {
	return optionFunc[T]{fn: fn, typ: typ}
}

// type Option[T any] func(T)
type OptionErr[T any] func(T) error

/*
usage:
func WithDataId(dataId int64) Option[*Client] {
	return func(obj *Client) {
		obj.DataId = dataId
	}
}

func NewClient(opts ...Option[*Client]) (obj *Client) {
	obj = &Client{}
	for _, v := range opts {
		v(obj)
	}
	return
}
*/

// WithDebug 设置调试模式的泛型函数
func WithDebug[T Debuggable](debug bool) Option[T] {
	//return NewOption(func(obj T) {
	//	obj.SetDebug(debug)
	//}, OptionTypeDebug)

	return func(obj T) {
		obj.SetDebug(debug)
	}
}

// 保留的option类型
//const (
//	OptionTypeDebug OptionType = "debug"
//)
